package com.common.code.controller;

import com.common.code.entity.User;
import com.common.code.mapper.UserMapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Controller类中的方法可以直接通过返回String跳转到jsp、ftl、html等模版页面。在方法上加@ResponseBody注解，也可以返回实体对象。
 * @RestController类中的所有方法只能返回String、Object、Json等实体对象，不能跳转到模版页面。
 * @RestController相当于@ResponseBody + @Controller
 * @RestController中的方法如果想跳转页面：
 * 方法前面添加@RequestMapping(value = "/index",method = RequestMethod.GET)
 *
 * @EnableAutoConfiguration 作用
 * 从classpath中搜索所有META-INF/spring.factories配置文件然后，将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration key对应的配置项加载到spring容器
 * 只有spring.boot.enableautoconfiguration为true（默认为true）的时候，才启用自动配置
 * @EnableAutoConfiguration还可以进行排除，排除方式有2中，一是根据class来排除（exclude），二是根据class name（excludeName）来排除
 * 其内部实现的关键点有
 * 1）ImportSelector 该接口的方法的返回值都会被纳入到spring容器管理中
 * 2）SpringFactoriesLoader 该类可以从classpath中搜索所有META-INF/spring.factories配置文件，并读取配置
 *
 * @RequestMapping详解
 * @RequestMapping注释用于映射url到控制器类或一个特定的处理程序方法。
 * 可用于类或方法上。用于类上，表示类中的所有响应请求的方法都是以该地址作为父路径
 */
@Api(value = "用户接口")
@RestController
@EnableAutoConfiguration
@RequestMapping("/UserController")
public class UserController {

//    @Autowired
//    private UserService userService;
//
//    @RequestMapping(value = "/selectAll", method = RequestMethod.GET, produces = "application/json")
//    public List<User> selectAll() {
//        return  userService.selectAll();
//    }

    /**
     * 另外一种方法：
     * 根据@Mapper的特性，自动生成一个接口实现类，就可以不要service包了，直接调用userMapper
     */
    @Autowired
    private UserMapper userMapper;

    //query-->用于get请求的参数拼接。请求参数的获取：@RequestParam(代码中接收注解)
    @ApiOperation(value = "获取用户", notes = "根据id查询用户信息")
    @ApiImplicitParam(name = "id", value = "用户id", required=true, dataType = "Integer", paramType = "query")
    //Restful风格的请求
    @GetMapping(value = "/selectUser/{id}")
    public Boolean selectUser(@PathVariable  Integer id) {
        return userMapper.selectUser(id);
    }


    @RequestMapping(value = "/selectAll", method = RequestMethod.GET, produces = "application/json")
    public List<User> selectAll() {
        return  userMapper.selectAll();
    }
}
